/**
 * @file videosurface.h
 * @author your name (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2022-10-20
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#ifndef SRC_VIDEOSURFACE_H_
#define SRC_VIDEOSURFACE_H_

#include <QObject>
#include <QOpenGLBuffer>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QOpenGLVertexArrayObject>
#include <QQuickFramebufferObject>
#include <QQuickItem>
#include <memory>
#include "camera/videocapturer.h"

#include "screenrecoder.h"


// 这是一个中简便的方式，但开发的功能不够丰富，不再使用

class VideoSurfaceRenderer : public QQuickFramebufferObject::Renderer,
                             protected QOpenGLFunctions {
 public:
  VideoSurfaceRenderer();

  ~VideoSurfaceRenderer();

  void render() override;

  void synchronize(QQuickFramebufferObject* item) override;

  // 初始化
  bool init();

 private:
  // 初始化shader
  bool initShader();

  // 初始化顶点数组
  bool initVertex();

 private:
  // 顶点数组对象
  QOpenGLVertexArrayObject m_vao;

  // 顶点数组缓冲区
  QOpenGLBuffer m_vbo;

  // 着色器
  QOpenGLShaderProgram m_program;

  // rgb 纹理
  QOpenGLTexture m_texRGB;

  // 图像指针
  QImage* m_pImg{nullptr};

  // 最新图像帧
  std::shared_ptr<AVFrame> m_lastFrame{nullptr};
};

class VideoSurface : public QQuickFramebufferObject {
  Q_OBJECT
  Q_PROPERTY(VideoCapturer* source WRITE setSource)
  Q_PROPERTY(int fps NOTIFY fpsChanged)

 public:
  explicit VideoSurface(QQuickItem* parent = nullptr);

  ~VideoSurface();

  // 创建渲染器
  Renderer* createRenderer() const override;

  // 获取最新帧
  std::shared_ptr<AVFrame> getLastFrame() {
    return m_lastFrame;
  }

  // 发送图像
  void sendImage(std::shared_ptr<QImage> img);

 protected:
  // 定时器事件
  void timerEvent(QTimerEvent* event) override;

 public slots:
  void onAVFrame(std::shared_ptr<AVFrame> frame);
  void setSource(VideoCapturer* src);

  // 开始记录
  void startRecord();

  // 停止记录
  void stopRecord();


 signals:
  // fps变化信号
  void fpsChanged(int fps);

  // 发送从现存新抓取的图像
  void newImage(std::shared_ptr<QImage> img);

 private:
  VideoCapturer* m_pVideoCapturer{nullptr};

  ScreenRecoder* m_pScreenRecoder{nullptr};

  mutable VideoSurfaceRenderer* m_pRender{nullptr};

  // pfs计数
  int m_iFpsCount{0};
  int m_iFpsCountTimerId{0};

  // 最新画面帧
  std::shared_ptr<AVFrame> m_lastFrame;
};

#endif  // SRC_VIDEOSURFACE_H_
